package fr.ifsic.film.server;

import java.util.ArrayList;
import java.util.List;

import org.hibernate.Session;
import org.hibernate.Transaction;

import com.google.gwt.user.server.rpc.RemoteServiceServlet;

import fr.ifsic.film.client.ProjetDop;
import fr.ifsic.film.client.dto.ActeurDTO;
import fr.ifsic.film.client.dto.FilmDTO;
import fr.ifsic.film.client.dto.PersonneDTO;
import fr.ifsic.film.client.dto.VedetteDTO;
import fr.ifsic.film.client.dto.VedetteIdDTO;
import fr.ifsic.film.server.jdbc.HibernateUtil;
import fr.ifsic.film.shared.Acteur;
import fr.ifsic.film.shared.Film;
import fr.ifsic.film.shared.Personne;
import fr.ifsic.film.shared.Vedette;
import fr.ifsic.film.shared.VedetteId;

/**
 * The server side implementation of the RPC service.
 */
public class ProjetDopImpl extends RemoteServiceServlet implements ProjetDop {

	private static final long serialVersionUID = 1L;

	@Override
	public Integer addP(PersonneDTO pdto) {
		Personne p = new Personne(pdto.getNom());
		p.setPrenom(pdto.getPrenom());
		p.setSexe(pdto.getSexe());
		Session sess = HibernateUtil.currentSession();
		Transaction tx = sess.beginTransaction();
		sess.save(p);
		tx.commit();
		return p.getP();
	}

	@Override
	public PersonneDTO getP(Integer cle) {
		Session sess = HibernateUtil.currentSession();
		Personne p = (Personne) sess.load(Personne.class, cle);
		PersonneDTO pdto = new PersonneDTO();
		pdto.setNom(p.getNom());
		pdto.setP(p.getP());
		pdto.setPrenom(p.getPrenom());
		pdto.setSexe(p.getSexe());
		return pdto;
	}

	@Override
	public void deleteP(Integer cle) {
		Session sess = HibernateUtil.currentSession();
		sess.beginTransaction();
		Personne p = (Personne) sess.load(Personne.class, cle);
		sess.delete(p);
		sess.getTransaction().commit();
	}

	@Override
	public PersonneDTO[] listPersonne() {
		Session sess = HibernateUtil.currentSession();
		sess.beginTransaction();
		List<Personne> result = new ArrayList<Personne>(sess
				.createSQLQuery("SELECT * FROM personne")
				.addEntity(Personne.class).list());
		PersonneDTO[] tabpdto = new PersonneDTO[result.size()];

		for (int i = 0; i < result.size(); i++) {
			tabpdto[i] = new PersonneDTO(result.get(i));
		}

		sess.getTransaction().commit();
		return tabpdto;
	}

	@Override
	public Integer addA(ActeurDTO adto) {
		Acteur a = new Acteur();
		a.setNbFilm(adto.getNbFilm());

		Session sess = HibernateUtil.currentSession();
		Transaction tx = sess.beginTransaction();
		Personne p = (Personne) sess.load(Personne.class, adto.getPersonne()
				.getP());
		a.setPersonne(p);
		sess.save(a);
		tx.commit();
		return a.getP();
	}

	@Override
	public void deleteA(Integer cle) {
		Session sess = HibernateUtil.currentSession();
		sess.beginTransaction();
		Acteur a = (Acteur) sess.load(Acteur.class, cle);
		sess.delete(a);
		sess.getTransaction().commit();
	}

	@Override
	public ActeurDTO[] listActeur() {
		Session sess = HibernateUtil.currentSession();
		sess.beginTransaction();
		List<Acteur> result = new ArrayList<Acteur>(sess
				.createSQLQuery("SELECT * FROM acteur").addEntity(Acteur.class)
				.list());
		ActeurDTO[] tabpdto = new ActeurDTO[result.size()];
		for (int i = 0; i < result.size(); i++) {
			tabpdto[i] = new ActeurDTO(result.get(i), new PersonneDTO(result
					.get(i).getPersonne()));
		}

		sess.getTransaction().commit();
		return tabpdto;
	}

	@Override
	public Integer addF(FilmDTO fdto) {
		Film f = new Film();
		f.setTitre(fdto.getTitre());
		f.setAnnee(fdto.getAnnee());
		f.setDuree(fdto.getDuree());
		f.setGenre(fdto.getGenre());

		Session sess = HibernateUtil.currentSession();
		Transaction tx = sess.beginTransaction();
		Personne p = (Personne) sess.load(Personne.class, fdto.getPersonne()
				.getP());
		f.setPersonne(p);
		sess.save(f);
		tx.commit();
		return f.getF();
	}

	@Override
	public void deleteF(Integer cle) {
		Session sess = HibernateUtil.currentSession();
		sess.beginTransaction();
		Film f = (Film) sess.load(Film.class, cle);
		sess.delete(f);
		sess.getTransaction().commit();

	}

	@Override
	public FilmDTO[] listFilm() {
		Session sess = HibernateUtil.currentSession();
		sess.beginTransaction();
		List<Film> result = new ArrayList<Film>(sess
				.createSQLQuery("SELECT * FROM film").addEntity(Film.class)
				.list());
		FilmDTO[] tabpdto = new FilmDTO[result.size()];
		for (int i = 0; i < result.size(); i++) {
			tabpdto[i] = new FilmDTO(result.get(i), new PersonneDTO(result.get(
					i).getPersonne()));
		}

		sess.getTransaction().commit();
		return tabpdto;
	}

	@Override
	public Integer addV(VedetteDTO vdto) {
		Vedette v = new Vedette();
		v.setRole(vdto.getRole());

		Session sess = HibernateUtil.currentSession();
		Transaction tx = sess.beginTransaction();
		Personne p = (Personne) sess.load(Personne.class, vdto.getPersonne()
				.getP());
		Film f = (Film) sess.load(Film.class, vdto.getFilm().getF());
		v.setPersonne(p);
		v.setFilm(f);
		v.setId(new VedetteId(f.getF(), p.getP()));
		sess.save(v);
		tx.commit();
		return f.getF();
	}

	@Override
	public void deleteV(VedetteIdDTO cle) {
		Session sess = HibernateUtil.currentSession();
		sess.beginTransaction();
		Vedette v = (Vedette) sess.load(Vedette.class, new VedetteId(
				cle.getF(), cle.getP()));
		sess.delete(v);
		sess.getTransaction().commit();

	}

	@Override
	public VedetteDTO[] listVedette() {
		Session sess = HibernateUtil.currentSession();
		sess.beginTransaction();
		List<Vedette> result = new ArrayList<Vedette>(sess
				.createSQLQuery("SELECT * FROM vedette")
				.addEntity(Vedette.class).list());
		VedetteDTO[] tabpdto = new VedetteDTO[result.size()];
		for (int i = 0; i < result.size(); i++) {
			
			PersonneDTO personneDTO = new PersonneDTO(result.get(i).getPersonne());
			PersonneDTO realisateurDTO = new PersonneDTO(result.get(i).getFilm().getPersonne());
			FilmDTO filmDTO = new FilmDTO(result.get(i).getFilm(), realisateurDTO);
			tabpdto[i] = new VedetteDTO(result.get(i), personneDTO , filmDTO);
			

		}

		sess.getTransaction().commit();
		return tabpdto;
	}
}
